<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>安装过程语言</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="xplang.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="xplang.html">快退</a></td><td width="60%" align="center" valign="bottom">章36. 过程语言</td><td width="10%" align="right" valign="top"><a href="xplang.html">快进</a></td><td width="10%" align="right" valign="top"><a href="plpgsql.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="XPLANG-INSTALL">36.1. 安装过程语言</a></h1>
<p>如果你要使用某种过程语言，那么你必须把它"安装"到要使用它的数据库里。不过那些安装到数据库 <tt class="LITERAL">template1</tt> 里的过程语言会自动在随后创建的数据库中安装。因此数据库管理员可以决定哪个数据库可以使用哪种语言，以及决定缺省时可以使用哪些语言。</p>
<p>对于那些随着标准版本发布的语言，只需要使用 <tt class="COMMAND">CREATE LANGUAGE</tt> <tt class="REPLACEABLE"><i>language_name</i></tt> 把语言安装到当前数据库中即可。另外，也可以使用 <a href="app-createlang.html"><span class="APPLICATION">createlang</span></a> 程序在 shell 命令行上安装语言。比如，要将 PL/pgSQL 安装到 <tt class="LITERAL">template1</tt> 数据库中，可以使用</p>
<pre class="PROGRAMLISTING">createlang plpgsql template1</pre>
<p>下面描述的手工安装方法只适用于那些 <tt class="COMMAND">CREATE LANGUAGE</tt> 还不知道的语言。</p>
<div class="PROCEDURE">
<p><b>手工安装过程语言</b></p>
<p>一个过程语言是按四个步骤安装到数据库里面去的，这些任务必须由数据库超级用户执行。对于 <tt class="COMMAND">CREATE LANGUAGE</tt> 已知的语言，第二和第三步可以忽略，因为它们会在需要的时候自动执行。</p>
<ol type="1">
<li class="STEP"><a name="XPLANG-INSTALL-CR1"></a>
<p>必须编译和安装该语言处理器的共享对象并安装到一个合适的库目录中。方法和安装用户定义的 C 函数的方法(<a href="xfunc-c.html#DFUNC">节33.9.6</a>)一样。通常，语言处理器需要外部库提供实际的引擎；如果是这样，那么这些库也必须安装。</p></li>
<li class="STEP"><a name="XPLANG-INSTALL-CR2"></a>
<p>处理器必须使用下面的命令声明</p>
<pre class="SYNOPSIS">CREATE FUNCTION <tt class="REPLACEABLE"><i>handler_function_name</i></tt>()
    RETURNS language_handler
    AS '<tt class="REPLACEABLE"><i>path-to-shared-object</i></tt>'
    LANGUAGE C;</pre>
<p><tt class="TYPE">language_handler</tt> 的返回类型告诉数据库系统该函数并不返回任何已定义的 SQL 数据类型，并且不能在 SQL 语句中被直接使用。</p></li>
<li class="STEP"><a name="XPLANG-INSTALL-CR3"></a>
<p>可选步骤。语言处理器可以提供一个"验证器"函数，这个函数检查函数的定义是否正确，而不会实际执行它。如果存在验证器函数，那么由 <tt class="COMMAND">CREATE FUNCTION</tt> 调用。如果一个验证器函数由处理器提供，那么用下面的命令声明</p>
<pre class="SYNOPSIS">CREATE FUNCTION <tt class="REPLACEABLE"><i>validator_function_name</i></tt>(oid)
    RETURNS void
    AS '<tt class="REPLACEABLE"><i>path-to-shared-object</i></tt>'
    LANGUAGE C;</pre></li>
<li class="STEP"><a name="XPLANG-INSTALL-CR4"></a>
<p>PL 必须用下面命令定义</p>
<pre class="SYNOPSIS">CREATE [<span class="OPTIONAL">TRUSTED</span>] [<span class="OPTIONAL">PROCEDURAL</span>] LANGUAGE <tt class="REPLACEABLE"><i>language-name</i></tt>
    HANDLER <tt class="REPLACEABLE"><i>handler_function_name</i></tt>
    [<span class="OPTIONAL">VALIDATOR <tt class="REPLACEABLE"><i>validator_function_name</i></tt></span>] ;</pre>
<p>可选的关键字 <tt class="LITERAL">TRUSTED</tt> 声明一个没有超级用户权限的普通数据库用户能否使用这种语言创建函数和触发器过程。因为 PL 函数在数据库后端内部执行，所以 <tt class="LITERAL">TRUSTED</tt> 标志应该只是用于那些不允许访问数据库服务器内部或文件系统的语言。PL/pgSQL, PL/Tcl, PL/Perl 语言都是可信的。PL/TclU, PL/PerlU, PL/PythonU 都被设计成提供无限的功能，因此<span class="emphasis"><i class="EMPHASIS">不应该</i></span>标记为可信。</p></li>
</ol>
</div>
<p><a href="xplang-install.html#XPLANG-INSTALL-EXAMPLE">例36-1</a>显示了如何手工安装 PL/pgSQL 语言。</p>
<div class="EXAMPLE"><a name="XPLANG-INSTALL-EXAMPLE"></a>
<p><b>例36-1. 手工安装 PL/pgSQL</b></p>
<p>下面的命令告诉数据库到那里才能找到用于 PL/pgSQL 语言的调用处理器函数的共享对象。</p>
<pre class="PROGRAMLISTING">CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler AS
    '$libdir/plpgsql' LANGUAGE C;</pre>
<p>PL/pgSQL 有一个验证器函数，所以还要声明它：</p>
<pre class="PROGRAMLISTING">CREATE FUNCTION plpgsql_validator(oid) RETURNS void AS
    '$libdir/plpgsql' LANGUAGE C;</pre>
<p>下面的命令</p>
<pre class="PROGRAMLISTING">CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql
    HANDLER plpgsql_call_handler
    VALIDATOR plpgsql_validator;</pre>
<p>声明了前面所定义的函数应该被那些调用语言属性是 <tt class="LITERAL">plpgsql</tt> 的函数或触发器过程使用。</p>
</div>
<p>在缺省的 PostgreSQL 安装里，PL/pgSQL 语言的处理器是制作并安装到"library"目录中去的。如果配置了 <span class="APPLICATION">Tcl</span> 支持，那么 PL/Tcl 和 PL/TclU 的处理器也都被编译并安装到同一个位置。类似的还有 PL/Perl 和 PL/PerlU 以及 PL/PythonU 。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="xplang.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="plpgsql.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">过程语言</td><td width="34%" align="center" valign="top"><a href="xplang.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">PL/pgSQL - SQL 过程语言</td></tr>
</table>
</div>
</body></html>